package main

import (
	"flag"
	"log"
)

func main() {
	//解析命令行参数
	flag.Parse()
	//获取解析后的参数列表
	args := flag.Args()
	//如果参数列表为空，程序将直接返回
	if len(args) <= 0 {
		return
	}

	var name string

	switch args[0] {
	case "go":
		//创建一个名为 goCmd 的新 FlagSet 对象
		goCmd := flag.NewFlagSet("go", flag.ExitOnError)
		//将 name 变量与 name 标志关联
		goCmd.StringVar(&name, "name", "Go语言", "帮助信息")
		//解析剩余的参数
		_ = goCmd.Parse(args[1:])
	case "php":
		//创建一个名为 phpCmd 的新 FlagSet 对象，该方法返回带有指定名称和错误处理属性的空命令集，相当于创建一个新的命令集去支持子命令
		phpCmd := flag.NewFlagSet("php", flag.ExitOnError)
		//将 name 变量与 n（短格式） 标志关联
		phpCmd.StringVar(&name, "n", "Go语言", "帮助语言")
		//解析剩余的参数
		_ = phpCmd.Parse(args[1:])
	}
	log.Printf("name: %s", name)
}

/*
输入：go run ./01_flag/flag02.go go -name=喜羊羊
输出：name=喜羊羊

输入：go run ./01_flag/flag02.go php -n=灰太狼
输出：name: 灰太狼

输入：go run ./01_flag/flag02.go go -n=喜羊羊
输出：
01_flag provided but not defined: -n
Usage of go:
  -name string
        帮助信息 (default "Go语言")
exit status 2
*/
